/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package alggen;

import java.awt.Point;

/**
 *
 * @author Macias
 */
class Osobnik {
    float wartPrzyst; //przystosowane danego osobnika
    Point[] sciezka = null;// = new Point[10]; //lista punktow danego osobnika
    Point startPoz,endPoz;
    int[][]mapa;
    boolean poPrzeszkodzie = false;
    boolean alive;
    
    float mass;
    float [] F = new float[20];
    float [] a = new float[20];
    float [] v = new float[20];

    Osobnik(Point StartPoz, Point EndPoz,int[][] mapa) {
        startPoz=StartPoz;
        endPoz=EndPoz;
        this.mapa=mapa;
        mass = 1;
        alive = true;
//        System.out.println("koszat = "+obliczKoszt(new Point(0,0),new Point(255,255)));
    }

    public Osobnik (Osobnik os){
        sciezka = new Point[os.sciezka.length];
        for(int i =0 ; i<os.sciezka.length;i++)
            sciezka[i] = (Point) os.sciezka[i].clone();

        for(int i =0 ; i<os.v.length;i++)
            v[i] = os.v[i];


        startPoz=os.startPoz;
        endPoz=os.endPoz;
        mapa=os.mapa;
        wartPrzyst = os.wartPrzyst;
        alive = os.alive;
    }

    public float obliczPrzystosowanie(){
        wartPrzyst=0;

        wartPrzyst+=obliczKoszt(startPoz,sciezka[0]);
        for( int i=0; i<sciezka.length-1;i++)
          wartPrzyst+=obliczKoszt(sciezka[i],sciezka[i+1]);

        wartPrzyst+=obliczKoszt(sciezka[sciezka.length-1],endPoz);

        return wartPrzyst;
    }

    private float obliczKoszt(Point pocz, Point kon) {
        float koszt=0;

        float[] dr = new float[2];       //krok calkowania
        dr[0]= kon.x-pocz.x;
        dr[1]= kon.y-pocz.y;
        float dlugosc =(float) Math.sqrt((kon.x-pocz.x)*(kon.x-pocz.x) + (kon.y-pocz.y)*(kon.y-pocz.y));
        dr[0]/=dlugosc;
        dr[1]/=dlugosc;

        float lastX = pocz.x;       //poprzedni punkt X - z poprzedniego calkowania
        float lastY = pocz.y;       //poprzedni punkt Y - z poprzedniego calkowania
        float pozX;        //aktualna pozycja X
        float pozY;      //aktualna pozycja Y


        int dWys;

        int maxStep = (int) dlugosc;

       

        
        for(int i = 0; i<maxStep;i++){
         pozX = lastX+dr[0];
         pozY = lastY+dr[1];

         dWys=mapa[(int)pozX][(int)pozY]-mapa[(int)lastX][(int)lastY];

         if(dWys<-20)poPrzeszkodzie=false;
         if(dWys>20)poPrzeszkodzie=true;

//         if(dWys<-20) koszt += -1*dWys - 19;
//            else if(dWys<-10)koszt+= -0.1*dWys -1;
//                else if(dWys<10)koszt += 0.1*dWys+1;
//                    else if(dWys<20) koszt+=0.2*dWys -1;
//                        else koszt+=dWys-18;
         if(dWys<-20) koszt += -100*dWys - 1999;
            else if(dWys<-10)koszt+= -0.1*dWys -1;
                else if(dWys<10)koszt += 0.1*dWys+1;
                    else if(dWys<20) koszt+=dWys -9;
                        else koszt+=100*dWys-1989;

         if(poPrzeszkodzie)koszt+=100;
         // znajdowanie przeszkody !!!########################


         lastX=pozX;
         lastY=pozY;
        }

//obliczanie kosztu na ostatnim odcinku - do punktu koncowego
         dWys=mapa[(int)kon.x][(int)kon.y]-mapa[(int)lastX][(int)lastY];
          if(dWys<-20) koszt += (-100*dWys - 1999)*(dlugosc-maxStep);
            else if(dWys<-10)koszt+= (-0.1*dWys -1)*(dlugosc-maxStep);
                else if(dWys<10)koszt += (0.1*dWys+1)*(dlugosc-maxStep);
                    else if(dWys<20) koszt+=(dWys -9)*(dlugosc-maxStep);
                        else koszt+=(100*dWys-1989)*(dlugosc-maxStep);
         if(poPrzeszkodzie)koszt+=100;
//        koszt=(float) Math.sqrt((kon.x-pocz.x)*(kon.x-pocz.x) + (kon.y-pocz.y)*(kon.y-pocz.y));

        return koszt;
    }

    @Override
    public String toString(){
        return ""+wartPrzyst+" ("+hashCode()+")";
    }
}
